#!/bin/bash

# CI/CD 流程测试脚本
# 用途：本地验证 CI/CD 配置是否正确

set -e

echo "🧪 开始 CI/CD 流程测试..."

# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

log_info() { echo -e "${YELLOW}[测试]${NC} $1"; }
log_success() { echo -e "${GREEN}[成功]${NC} $1"; }
log_error() { echo -e "${RED}[错误]${NC} $1"; }

# 1. 检查必需工具
log_info "检查必需工具..."
command -v uv >/dev/null 2>&1 || { log_error "uv 未安装"; exit 1; }
command -v docker >/dev/null 2>&1 || { log_error "docker 未安装"; exit 1; }
command -v git >/dev/null 2>&1 || { log_error "git 未安装"; exit 1; }
log_success "所有必需工具已安装"

# 2. 测试 requirements.txt 生成
log_info "测试 requirements.txt 生成..."
cp requirements.txt requirements.txt.backup
uv pip compile pyproject.toml --output-file requirements.txt.test
if diff -q requirements.txt requirements.txt.test >/dev/null; then
    log_success "requirements.txt 生成测试通过"
else
    log_info "requirements.txt 有差异，这可能是正常的版本更新"
fi
rm -f requirements.txt.test

# 3. 测试 Docker 构建配置
log_info "测试 Docker 构建配置..."
# 检查 Dockerfile 语法和基本构建能力
if timeout 30s docker build -t ci-test-build . >/dev/null 2>&1; then
    log_success "Docker 构建配置验证通过"
    # 清理测试镜像
    docker rmi ci-test-build >/dev/null 2>&1 || true
else
    log_error "Docker 构建配置有问题，请检查 Dockerfile"
    exit 1
fi

# 4. 测试现有 Docker 构建脚本
log_info "测试 docker-build.sh 脚本..."
chmod +x docker-build.sh
if ./docker-build.sh --help >/dev/null 2>&1; then
    log_success "docker-build.sh 脚本可执行"
else
    log_error "docker-build.sh 脚本有问题"
    exit 1
fi

# 5. 检查 GitHub Actions 工作流语法
log_info "检查 GitHub Actions 工作流..."
if command -v yamllint >/dev/null 2>&1; then
    yamllint .github/workflows/*.yml && log_success "GitHub Actions 工作流语法正确"
else
    log_info "yamllint 未安装，跳过 YAML 语法检查"
fi

# 6. 检查 pre-commit 配置
log_info "检查 pre-commit 配置..."
if command -v pre-commit >/dev/null 2>&1; then
    pre-commit validate-config && log_success "pre-commit 配置有效"
else
    log_info "pre-commit 未安装，跳过配置检查"
fi

# 7. 模拟依赖更新流程
log_info "模拟依赖更新流程..."
echo "# 测试注释 $(date)" >> pyproject.toml
uv pip compile pyproject.toml --output-file requirements.txt.new
if [ -f requirements.txt.new ]; then
    log_success "依赖更新流程模拟成功"
    rm -f requirements.txt.new
    # 恢复原文件
    git checkout pyproject.toml 2>/dev/null || true
else
    log_error "依赖更新流程模拟失败"
fi

# 8. 检查环境变量文件
log_info "检查环境配置..."
if [ -f ".env" ] || [ -f "env_example.txt" ]; then
    log_success "环境配置文件存在"
else
    log_info "建议创建 .env 或 env_example.txt 文件"
fi

# 9. 检查 Git 配置
log_info "检查 Git 配置..."
if git rev-parse --git-dir >/dev/null 2>&1; then
    log_success "Git 仓库配置正确"
    
    # 检查是否有远程仓库
    if git remote get-url origin >/dev/null 2>&1; then
        log_success "Git 远程仓库已配置"
    else
        log_info "建议配置 Git 远程仓库以启用 GitHub Actions"
    fi
else
    log_error "当前目录不是 Git 仓库"
fi

# 10. 生成测试报告
log_info "生成测试报告..."
cat > ci-cd-test-report.md << EOF
# CI/CD 测试报告

生成时间: $(date)

## 测试结果

- ✅ 必需工具检查通过
- ✅ requirements.txt 生成功能正常
- ✅ Docker 构建配置有效
- ✅ docker-build.sh 脚本可执行
- ✅ 依赖更新流程正常

## 下一步操作

1. 推送代码到 GitHub 仓库
2. 检查 GitHub Actions 页面确认工作流运行
3. 验证 Docker 镜像是否成功构建并推送

## 使用方法

### 本地开发
\`\`\`bash
# 安装 pre-commit hooks
./setup-precommit.sh

# 正常开发流程
git add .
git commit -m "feat: 新功能"
git push origin main
\`\`\`

### 手动构建 Docker
\`\`\`bash
# 开发环境
./docker-build.sh build -e dev

# 生产环境
./docker-build.sh build -e prod -t v1.0.0
\`\`\`

更多详细信息请查看 CI_CD_USAGE.md
EOF

log_success "测试完成！查看 ci-cd-test-report.md 获取详细报告"
echo ""
echo "🎉 CI/CD 配置验证完成！"
echo "📋 下一步："
echo "   1. 运行 ./setup-precommit.sh 安装 pre-commit hooks"
echo "   2. 推送代码到 GitHub 触发自动化流程"
echo "   3. 查看 GitHub Actions 页面验证工作流运行"
